package com.stephen.redisdemo.thread;

import java.util.concurrent.*;

/**
 * @author: stephen
 * @create: 2020-03-01 20:10
 * @description: 手写线程池
 * 阿里规范不许使用Executors创建线程池,都有问题
 * 注意: new LinkedBlockingQueue<>(xxx),必须指明队列大小,否则默认是Integer.MAX_VALUE,可能会堆积大量请求导致OOM
 * 4种拒绝策略:
 * new ThreadPoolExecutor.AbortPolicy() 这个会直接抛异常
 * new ThreadPoolExecutor.CallerRunsPolicy() 这个会把多余的任务返回给调用者,如main线程
 * new ThreadPoolExecutor.DiscardOldestPolicy() 抛弃队列中最老的任务,执行新的任务
 * new ThreadPoolExecutor.DiscardPolicy() 直接丢弃多余的任务
 *
 */
public class MyThreadPool {

    public static void main(String[] args) {

        // 查看CPU核数
        System.out.println(Runtime.getRuntime().availableProcessors());

        ExecutorService threadPool = new ThreadPoolExecutor(
                2, // 核心线程数
                5,             // 最大线程数
                1L,              // 超时时间
                TimeUnit.SECONDS,             // 时间的单位
                new LinkedBlockingQueue<>(3),// 阻塞队列,长度为3
                Executors.defaultThreadFactory(),    // 线程工厂,用来创建线程
                new ThreadPoolExecutor.AbortPolicy());// 拒绝策略

        try {
            for (int i = 0; i < 9; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 处理业务");
                    try {
                        TimeUnit.MILLISECONDS.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }

    }

}
